"""
函数的递归-递归就是方法自己调用自己，直到按照一个特定的逻辑结束
    递归的作用-使用递归可以比较快速的生成一个树形结构数据-例如红黑树
    递归常用于-菜单(1级，2级，3级)-省市区三级联动 这种数据都是树形数据
"""

"""
例子：计算1到10的阶乘
"""


def fact(num):
    if int(num) == 1:
        return 1
    return num * fact(num - 1)


print(fact(1))
print(fact(5))
# print(fact(1000)) # 递归内存溢出

"""
递归本质上还是循环，相比于循环递归业务更加清晰
递归的问题，递归由于是自身调用自身，所以可能会出现无限递归无法退出的情况，会导致内存溢出
    原因:栈的问题，由于每个方法都是一个栈会有栈帧这个概念，没多一次递归栈帧就往下移一位栈帧-jvm内存模型
    解决方式：尾递归，就是函数的最后一步再进行递归，这样能解决内存溢出的问题
"""
"""
尾递归方法改造-将下标值和总数值添加到方法进行计算
"""


def fact_result(num, calculate):
    res=calculate * num
    if num == 1:
        return calculate
    return fact_result(num - 1, res)


def fact_cal(n):
    return fact_result(n, 1)


print(str(fact_cal(500)))
